Skip to content

[유병규-17주차 알고리즘 스터디] #77

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

Gyulguma
Copy link

🚀 싸피 15반 알고리즘 스터디 17주차 [유병규]

📌 문제 풀이 개요

  • 이번 PR에서는 다음 5문제의 풀이를 포함합니다.
  • 각 문제에 대한 풀이 과정과 접근 방식을 설명합니다.

✅ 문제 해결 여부

  • 피아의 아틀리에 ~신비한 대회의 연금술사~
  • 새로운 게임 2
  • 군사 이동
  • 인하니카 공화국
  • 택배

💡 풀이 방법

문제 1: 피아의 아틀리에 ~신비한 대회의 연금술사~

문제 난이도

  • 골드 1

문제 유형

  • 구현, 브루트포스, 시뮬레이션

접근 방식 및 풀이

  • 문제를 정리하면 다음과 같습니다.
 재료(4x4)
 	- 효능: -9~9
 	- 원소: R/B/G/Y/W
 
 가마(5x5)
 	- 품질: 초기 0 -(재료)-> 품질+효능(0~9)
 	- 원소: 초기 W -(재료)-> 재료원소:W => 그대로 / 그 외 재료 원소 색으로.
 
 재료 3개 고른 뒤 순서를 정해 하나씩 가마에 넣음(90도씩 회전가능).
 
 빨강, 파랑, 초록, 노랑으로 칠해진 부분의 품질 합을 각각 R, B, G, Y
 폭탄의 품질 = 7R + 5B + 3G + 2Y
 
 폭탄의 최대 품질 값
  • 주어진 재료를 순서를 고려하여 $N$개 중에 3개를 선택한 후 가마에 넣는 문제입니다.
  • 이때 재료를 90도 회전할 수 있고, 재료의 왼쪽 상단을 가마의 [0,0],[1,0],[0,1],[1,1] 중 한 곳에 넣을 수 있습니다.
  • $n<=10$, 재료 선택이 3개이기 때문에 DFS로 구현하였습니다. 처음에는 재료를 하나 선택하여 회전하고 가마에 더한 뒤 다음 재료를 선택하도록 구현하였는데, 시간초과가 났습니다. 이 방법을 사용하면 백트래킹을 위해 가마를 이전 상태로 되돌려놔야 되기 때문에 copy()가 필요했고 이 과정에서 연산이 많이 수행되었습니다.
  • 최적화를 위해 재료를 선택한 뒤 매번 재료를 돌려보는 것이 아니라 미리 재료를 돌려놓은 상태를 저장해놓아 계산 수를 줄였습니다. 또한 재료를 하나 선택할 때마다 가마에 더하는 것이 아닌, 재료의 순서와 상태, 가마에 넣는 위치를 미리 정해놓은 후, 한 번에 가마에 더하는 방식으로 수정하여 문제를 해결할 수 있었습니다. 위 방법을 사용 시 가마를 copy()할 필요가 없어져 시간을 줄일 수 있습니다.

문제 2: 새로운 게임 2

문제 난이도

  • 골드 2

문제 유형

  • 구현, 시뮬레이션

접근 방식 및 풀이

  • 말이 이동할 때 말 위에 또다른 말이 있을 경우 같이 이동해야 하고, 말로 만들어진 탑에서 중간 위치의 말이 이동할 경우 해당 말 위에 있는 말들만 같이 이동하는 등등, 말과 말이 연결되고 끊어지는 연산이 자주 나오고, 말이 4개 이상 모이면 게임이 끝나므로 LinkedList 형식으로 구현하였습니다.
  • 말의 정보를 저장하는 Piece 클래스를 생성하였고 아래 필드를 가집니다.
    • x, y: 말의 x좌표와 y좌표
    • dir: 말의 방향
    • up: 바로 위에 있는 말
    • down: 바로 아래에 있는 말
  • 보드에서 각 칸에는 어떤 말이 존재하는 지 알아야 하기에 Cell 클래스를 생성하였고 아래 필드를 가집니다.
    • type: 칸의 타입(흰색, 빨간색, 파란색)
    • bottom: 해당 칸과 직접 닿아있는 말
  • 두 클래스를 사용하여 직접 말을 움직이며 해결할 수 있었습니다.

문제 3: 군사 이동

문제 난이도

  • 골드 3

문제 유형

  • 자료구조, 분리 집합

접근 방식 및 풀이

  • 시작 정점에서 도착 정점까지 가는 길 중에서 가중치가 가장 작은 값이 최대가 되도록 하는 길을 찾는 문제입니다.
  • 이전에 풀었던 세부 문제와 동일한 문제라 생각되어 MST를 사용하여 문제를 해결하였습니다.
  • 힙의 정렬 조건을 '이제까지의 경로 중 최소 가중치'의 값이 더 큰 값이 선행되도록 수정하였고, 도착 정점에 왔을 시 저장했던 값이 정답이기 때문에 출력하고 종료하였습니다.

문제 4: 인하니카 공화국

문제 난이도

  • 골드 3

문제 유형

접근 방식 및 풀이


문제 5: 택배

문제 난이도

  • 골드 1

문제 유형

  • 그리디, 정렬

접근 방식 및 풀이

  • 트럭은 다시 뒤로 돌아오지 않고, 최대한 많은 택배를 배달해야하므로 택배가 트럭에 적재되어 있는 시간이 가장 짧아야 합니다.
  • 그래서 입력 값(배송 정보)을 도착지 기준으로 오름차순 정렬을 하여 택배를 빨리 내리도록 설정하였습니다.
  • 이때 도착지 기준으로 정렬하였기 때문에 이 택배를 언제 실을 수 있고 얼만큼 실을 수 있는 지를 계산해야 합니다. 이를 마을을 지나면서 매번 적제하는 시뮬레이션 방식 대신 해당 택배를 배송할 시점의 상황을 계산하였습니다.
  • 먼저 각 마을을 지날 시점의 적재량을 계산하는 배열(village)을 생성한 후 정렬한 배송 정보를 순회하며 다음 작업을 진행합니다.
    1. 해당 택배의 출발지부터 도착지 바로 전까지 마을들 중 적재량이 가장 많은 값(maxLoad)을 가져옵니다.
    2. '트럭 용량maxLoad'와 '해당 택배의 개수' 중 더 작은 값이 트럭에 적재할 수 있는 값이고, 이는 곧 배달할 수 있는 값이므로 결과 값(result)에 더해줍니다.
    3. 이 택배는 출발지와 도착지 바로 전까지 마을을 지나면서 가지고 다녀야 하는 택배이기 때문에 출발지부터 도착지 바로 전까지 마을 각각에 적재량을 더해줍니다.(village배열)
    4. 모든 배송 정보에 대해 1~3번을 반복합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant